package com.cmdb.system.utils;

import com.cmdb.system.service.ISysConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.util.DigestUtils;
import org.springframework.web.client.RestTemplate;
import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

/**
 * 短信发送工具类
 */
@Component
public class SmsSenderUtil {
    private static final Logger log = LoggerFactory.getLogger(SmsSenderUtil.class);
    @Autowired
    private ISysConfigService configService;
    /** 平台用户名 */
    private static String username;
    /** 平台密码 */
    private static String password;
    /** 平台签名（如[中国乡村资讯]） */
    private static String sign;
    /** 平台发送手机号（用于加密） */
    private static String sendPhone;
    /** 平台接口地址 */
    private static String url;
    /** 短信内容 */
    private static String content;
    @PostConstruct
    public void init() {

        username = configService.selectConfigByKey("sys.sms.username");
        password = configService.selectConfigByKey("sys.sms.password");
        sign = configService.selectConfigByKey("sys.sms.sign");
        sendPhone = configService.selectConfigByKey("sys.sms.sendPhone");
        url = configService.selectConfigByKey("sys.sms.url");
        content = configService.selectConfigByKey("sys.sms.content");

    }

    /**
     * 生成16位小写MD5
     * @param text 明文
     * @return 16位小写MD5
     */
    public static String md5_16(String text) {
        String md5_32 = DigestUtils.md5DigestAsHex(text.getBytes(StandardCharsets.UTF_8));
        return md5_32.substring(8, 24);
    }

    /**
     * 发送普通/群发短信
     * @param phones 多个手机号用|分隔
     * @param content 短信内容（需带签名）
     */
    public static void sendNormalMessage(String phones, String content) {
        sendSmsRequest("normalMessage", phones, content, null, null, null, null, null, null);
    }

    /**
     * 发送个性化短信
     * @param p2pJson JSON格式的手机号与内容映射，如{'手机号1':'内容1','手机号2':'内容2'}
     */
    public static void sendP2PMessage(String p2pJson) {
        sendSmsRequest("p2pMessage", "", p2pJson, null, null, null, null, null, null);
    }

    /**
     * 发送验证码短信
     * @param phone 接收手机号
     * @param code 验证码
     * @param effectiveTime 有效时间（分钟）
     * @param companyName 单位名（模板1/4必填）
     * @param appName 应用/平台名（模板2/3必填）
     * @param templateNo 模板编号（1,2,3,4）
     */
    public static void sendValidCode(String phone, String code, String effectiveTime, String companyName, String appName, String templateNo) {
        sendSmsRequest("sendValidCode", phone, null, effectiveTime, code, companyName, appName, templateNo, null);
    }

    /**
     * 通用短信请求方法
     */
    private static void sendSmsRequest(String method, String phones, String contentOrJson, String effectiveTime, String verificationCode,
                                       String companyName, String appName, String templateNo, String extra) {


        String md5Password = md5_16(username + password + sendPhone);
        log.info("短信: " + phones);


        Map<String, Object> param = new HashMap<>();
        param.put("method", method);
        param.put("username", username);
        param.put("password", md5Password);

        if ("sendValidCode".equals(method)) {
            param.put("phones", phones);
            param.put("effectiveTime", effectiveTime);
            param.put("verificationCode", verificationCode);
            param.put("companyName", companyName);
            param.put("appName", appName);
            if (templateNo != null) param.put("templateNo", templateNo);
        } else if ("normalMessage".equals(method)) {
            param.put("phones", phones);
            param.put("s_msgcount", content+sign);
        } else if ("p2pMessage".equals(method)) {
            param.put("s_msgcount", contentOrJson);
        }

        // 可扩展extra参数
        if (extra != null) {
            // 解析并加入param
        }

        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, Object>> entity = new HttpEntity<>(param, headers);
        try {
            ResponseEntity<String> response = restTemplate.postForEntity(url, entity, String.class);
            System.out.println("短信发送响应: " + response.getBody());
        } catch (Exception e) {
            System.err.println("短信发送异常: " + e.getMessage());
        }
    }
} 